from django.contrib import admin
from index.models import Product, Type

# Register your models here.

# 修改站点配置信息
admin.site.site_title = 'MyDjango项目后台管理'
admin.site.site_header = 'MyDjango'

# 方法一
# 直接注册到admin后台，这是最基本的方式，但是我们不推荐使用
# admin.site.register(Product)
# admin.site.register(Type)


# 方法二
# 自定义ProductAdmin类,并继承ModelAdmin
# 自定义TypeAdmin类,并继承ModelAdmin

# 注册方法1：使用Python装饰器将ProductAdmin和模型Product进行绑定并注册到后台
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):   # 依旧需要定义 ProductAdmin这个类
    # 设置显示字段，用于admin后台数据的表头设置
    list_display = ['id', 'name', 'weight', 'size', 'type']
    # 设置可搜索字段，并在Admin后台数据生成搜索框，如有外键，应该使用双下划线连接两个模型的字段
    search_fields = ['id', 'name', 'type__type_name']   # type__type_name前面是两个下划线
    # 设置过滤器，在后台数据的右侧生成导航栏，如有外键，应该使用双下划线连接两个模型的字段
    list_filter = ['name', 'type__type_name']    # type__type_name前面是两个下划线
    # 设置排序方式['id']为升序，降序为['-id']
    ordering = ['id']
    # 设置时间选择器，如字段中包含时间格式才可以使用
    # date_hierarchy = Field
    # 在添加新数据时，设置可添加数据的字段
    fields = [ 'name', 'weight', 'size', 'type']
    # 设置可读字段，在修改或新增数据时使其无法设置
    # readonly_fields = ['name']


    # 在admin.py的ProductAdmin中添加自定义字段
    # 添加自定义字段，在属性list_display中添加自定义字段colored_type，colored_type来源于模型Product
    list_display.append('colored_type')

    # 重写get_readonly_fields函数，设置超级用户和普通用户的权限
    # def get_readonly_fields(self, request, obj=None):
    #     if request.user.is_superuser:
    #         self.readonly_fields = []
    #     else:
    #         self.readonly_fields = ['name']
    #     return self.readonly_fields

    # 根据当前用户名设置数据访问权限，需要重写get_queryset方法
    # def get_queryset(self, request):
    #     qs = super(ProductAdmin,self).get_queryset(request)
    #     if request.user.is_superuser:
    #         return qs
    #     else:
    #         return qs.filter(id__lt =6)  # 非超级用户只能查看前5条数据


    # 重写formfield_for_foreignkey方法，可以在新增或者修改数据时，
    # 设置外键可选值（对下拉框的内容进行过滤，只能对某个表中被设置为外键的字段使用）
    # 举个例子，以前有9中类型，现在只能显示前3种，其他的只有管理员才能使用
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'type':
            if not request.user.is_superuser:
                kwargs['queryset'] = Type.objects.filter(id__lt=4)
        return super(admin.ModelAdmin,self).formfield_for_foreignkey(db_field,request,**kwargs)


    # 修改保存方法
    def save_model(self, request, obj, form, change):  # obj为当前数据所对应的数据模型，form为admin的数据修改页面所对应的数据表单
        if change:   # change表示修改数据
            # 获取当前的用户名
            user =request.user
            # 使用模型获取数据，pk代表具有主键属性的字段
            name = self.model.objects.get(pk =obj.pk).name
            # 使用表单获取数据
            weight = form.cleaned_data['weight']
            # 写入日志文件
            f = open('I:\Django\MyDjango\MyDjango_log.txt','a')
            f.write('产品：'+str(name)+'，被用户：'+str(user)+'修改'+'\r\n')
            f.close()
        else:   # 表示新增数据
            f = open('I:\Django\MyDjango\MyDjango_log.txt', 'a')
            f.write('新增数据成功！' + '\r\n')
            f.close()
        # 使用super可以使自定义save_model既保留父类已有的功能又添加自定义的功能
        super(ProductAdmin, self).save_model(request, obj, form, change)



# 注册方法2：
# admin.site.register(Product, ProductAdmin)   # 依旧需要定义 ProductAdmin这个类


@admin.register(Type)
class TypeAdmin(admin.ModelAdmin):
    list_display = ['id', 'type_name']

# admin.site.register(Type, TypeAdmin)   # 依旧需要定义 TypeAdmin这个类

